Details
-
Bug
-
Resolution: Fixed
-
Critical
-
None
-
None
-
None
-
Operating System: All
Platform: All
-
92
Description
If you use TimeBasedRollingPolicy to rollover a log file and no log wasn't wrote into the log beyond the timing of rollover, and if you restart your application, the log file doesn't roll, then new log will be appended into old log file.
EVIDENCE:
1. in logback.xml, set your FileNamePattern like 'log.%d
2. Simply do a kind of thing, which will make some logs into your log file.
3. Wait for some minutes.
4. restart your application.
5. do a kind of thing, which will make some logs into your log file.
the FileNamePattern is 'log.%d{yyyy-MM-dd_HH-mm}
.log', so the log file will be roll every minutes. On case 5 of above example, the log file should be roll over, because some minutes already have passed after last logs wrote into the log file. But the file didn't be roll overed.
THE CAUSE:
In start() method of TimeBasedRollingPolicy, you initialize a variable 'lastCheck' to System.currentTimeStamp(). So if you restart your application, the last check time will be set to just NOW.
you should initialize the variable to a last modified time of a current log file.
See below source code. from '//modified by Tsutomu YANO' to '//until here'.
SOURCE:
public void start() {
// set the LR for our utility object
util.setContext(this.context);
compress.setContext(this.context);
// find out period from the filename pattern
if (fileNamePatternStr != null)
else
{ addWarn(FNP_NOT_SET); addWarn(SEE_FNP_NOT_SET); throw new IllegalStateException(FNP_NOT_SET + SEE_FNP_NOT_SET); }DateTokenConverter dtc = fileNamePattern.getDateTokenConverter();
if (dtc == null)
{ throw new IllegalStateException("FileNamePattern [" + fileNamePattern.getPattern() + "] does not contain a valid DateToken"); } int len = fileNamePatternStr.length();
switch (compressionMode)
addInfo("Will use the pattern " + activeFileNamePattern + " for the active file");
rc = new RollingCalendar();
rc.init(dtc.getDatePattern());
addInfo("The date pattern is '" + dtc.getDatePattern() + "' from file name pattern '" + fileNamePattern.getPattern() + "'.");
rc.printPeriodicity(this);
//modified by Tsutomu YANO
//if a current log file exists, initialize a 'lastCheck' variable to the
//last modified date of the file.
File currentFile = new File(getParentFileName());
if(currentFile.exists() && currentFile.canRead())
else
{ // currentTime = System.currentTimeMillis(); lastCheck.setTime(getCurrentTime()); }//until here
nextCheck = rc.getNextCheckMillis(lastCheck);
// Date nc = new Date();
// nc.setTime(nextCheck);
}
Attachments
Issue Links
- is duplicated by
-
LOGBACK-104 TimeBasedRollingPolicy doesn't roll if the date change happens when the application is not currently running
- Resolved
-
LOGBACK-231 rolling policy which starts new file on system startup
- Resolved